package com.dragon.modules.yuegou.model.rbac;

import com.dragon.modules.yuegou.enums.YsqAppType;
import com.dragon.modules.yuegou.utils.AppUtils;
import com.fasterxml.jackson.annotation.JsonCreator;

import java.util.Map;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 进行角色权限管理的应用
 * @author liuwu
 *
 */
public enum RbacApp{

	/**
	 * 大运营后台
	 */
	YSQ_PLATFORM(YsqAppType.YSQ_PLATFORM),
	/**
	 * 集团版后台
	 */
	YSQ_GROUP(YsqAppType.YSQ_GROUP),
	/**
	 * 悦商圈APP安卓版
	 */
	YSQ_APP_ANDROID(YsqAppType.YSQ_APP_ANDROID),
	/**
	 * 悦商圈APP IOS版
	 */
	YSQ_APP_IOS(YsqAppType.YSQ_APP_IOS),
	/**
	 * 悦购小程序
	 */
	YSQ_XCX(YsqAppType.YSQ_XCX),
	/**
	 * 商户版后台
	 */
	YSQ_MERCHANT(YsqAppType.YSQ_MERCHANT),
	/**
	 * 悦商惠
	 */
	YSQ_MERCHANT_XCX(YsqAppType.YSQ_MERCHANT_XCX);

	private final YsqAppType app;

	private RbacApp(YsqAppType app) {
		this.app = app;
	}

	/**
	 * 获取应用
	 * @return
	 */
	public YsqAppType getApp() {
		return app;
	}


	public Integer getCode() {
		return app.getTypeId();
	}
	
	/**
	 * 获取应用类型ID
	 * 
	 * @return 应用类型ID
	 */
	public int getTypeId() {
		return app.getTypeId();
	}

	/**
	 * 应用别名
	 * 
	 * @return alias
	 */
	public String getAlias() {
		return app.getAlias();
	}
	
	/**
	 * 可以访问应用的用户类型
	 * 
	 * @return userType
	 */
	public com.dragon.modules.yuegou.enums.PrincipalType getUserType() {
		return app.getUserType();
	}
	
	/**
	 * 获取当前应用类型<br>
	 * 请注意，只能在HTTP请求线程使用，在后台线程中调用这个方法将会抛出异常
	 * 
	 * @return 当前应用类型
	 */
	public static RbacApp current() {
		return from(AppUtils.current());
	}
	
	public static RbacApp from(YsqAppType app) {
		return APP_MAP.get(app);
	}

	@JsonCreator
	public static RbacApp from(int appId) {
		return CODE_MAP.get(appId);
	}

	private static final Map<Integer, RbacApp> CODE_MAP = Stream.of(RbacApp.values())
			.collect(Collectors.toMap(RbacApp::getTypeId, UnaryOperator.identity()));
	
	private static final Map<YsqAppType, RbacApp> APP_MAP = Stream.of(RbacApp.values())
			.collect(Collectors.toMap(RbacApp::getApp, UnaryOperator.identity()));
}
